//题目:
// 给定一个字符串 s ，请计算这个字符串中有多少个回文子字符串。
// 具有不同开始位置或结束位置的子串，即使是由相同的字符组成，也会被视作不同的子串。
// 示例 1：
// 输入：s = "abc"
// 输出：3
// 解释：三个回文子串: "a", "b", "c"

// 示例 2：
// 输入：s = "aaa"
// 输出：6
// 解释：6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
#include<iostream>
#include<vector>

using namespace std;
//代码
class Solution 
{
public:
    int countSubstrings(string s) 
    {
        int n=s.size();
        //1.创建dp表————dp[i][j]表示：以s[i]为起点，以s[j]为终点的字符串是否是回文字符串
        vector<vector<bool>> dp(n,vector<bool>(n,false));
        //2.初始化
        //3.填表————从后往前 + 确定返回值
        int ret=0;
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j] && (i==j || i+1==j || dp[i+1][j-1]==true))
                {
                    dp[i][j]=true;
                    ret++;
                }
            }
        }
        return ret;
    }
};